package co.yixiang.config;

import co.yixiang.modules.system.domain.Dept;
import co.yixiang.modules.system.service.DeptService;
import co.yixiang.modules.system.service.RoleService;
import co.yixiang.modules.system.service.UserService;
import co.yixiang.modules.system.service.dto.RoleSmallDto;
import co.yixiang.modules.system.service.dto.UserDto;
import co.yixiang.utils.SecurityUtils;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * 数据权限配置
 */
@Component
public class DataScope {

    private final String[] scopeType = {"全部","本级","自定义"};

    private final UserService userService;

    private final RoleService roleService;

    private final DeptService deptService;

    /**
     * 构造函数，注入用户、角色和部门服务
     * @param userService 用户服务，用于获取用户信息
     * @param roleService 角色服务，用于查询用户角色
     * @param deptService 部门服务，用于查询部门信息
     */
    public DataScope(UserService userService, RoleService roleService, DeptService deptService) {
        this.userService = userService;
        this.roleService = roleService;
        this.deptService = deptService;
    }

    /**
     * 获取用户有权限访问的部门ID集合
     * @return 包含部门ID的集合
     */
    public Set<Long> getDeptIds() {
        UserDto user = userService.findByName(SecurityUtils.getUsername());
        Set<Long> deptIds = new HashSet<>();
        List<RoleSmallDto> roleSet = roleService.findByUsersId(user.getId());

        for (RoleSmallDto role : roleSet) {
            // 如果数据范围为"全部"，则返回空集合，表示拥有所有权限
            if (scopeType[0].equals(role.getDataScope())) {
                return new HashSet<>();
            }

            // 处理"本级"权限，添加用户所在部门ID
            if (scopeType[1].equals(role.getDataScope())) {
                deptIds.add(user.getDept().getId());
            }

            // 处理"自定义"权限，获取角色关联的部门及其子部门ID
            if (scopeType[2].equals(role.getDataScope())) {
                Set<Dept> depts = deptService.findByRoleIds(role.getId());
                for (Dept dept : depts) {
                    deptIds.add(dept.getId());
                    List<Dept> deptChildren = deptService.findByPid(dept.getId());
                    if (deptChildren != null && deptChildren.size() != 0) {
                        deptIds.addAll(getDeptChildren(deptChildren));
                    }
                }
            }
        }
        return deptIds;
    }

    /**
     * 递归获取指定部门列表的所有子部门ID
     * @param deptList 部门列表
     * @return 包含所有子部门ID的列表
     */
    public List<Long> getDeptChildren(List<Dept> deptList) {
        List<Long> list = new ArrayList<>();
        deptList.forEach(dept -> {
            if (dept != null && dept.getEnabled()) {
                List<Dept> depts = deptService.findByPid(dept.getId());
                if (deptList.size() != 0) {
                    list.addAll(getDeptChildren(depts));
                }
                list.add(dept.getId());
            }
        });
        return list;
    }
}
